﻿/*
(C)小草莓软件	https://www.xcmsoft.com/
QQ：406675425
Email：406675425@qq.com
*/ 
#pragma once
#include "HmjButton.h"
#include "HmjListBox.h"
#include "HmjCell.h"
#include "HmjLabel.h"
#include "PassWordPane.h"
#include "RunStatusLabel.h"
#include "AbortPane.h"
#include "../ConfigLoader/LogicConfigLoader.h"
#include "../ConfigLoader/ConfigLoader.h"
#include "../Domain/SignalObjectFactory.h"
#include "../Domain/WorkModeFactory.h"
#include "../Domain/ParameterFactory.h"
#include "../Domain/BaseStruct.h"
#include "../WorkerThreads/ThreadManager.h"
#include "../WorkerThreads/DataManager.h"
#include "../Logic/LogicFactory.h"
#include "HmjUiObjectManager.h"
#include "../Logic/LogicTimerManager.h"
#include "../Logic/LogicCounterManager.h"
#include "../Logic/StatusTimeManager.h"
#include "../Logic/ActionSignalManager.h"
#include "../Domain/UiSignalFactory.h"
#include "EditListBox.h"
#include "afxwin.h"


// CHsvcsDlg 对话框
class CHsvcsDlg : public CDialogEx
{
// 构造
public:
	CHsvcsDlg(CWnd* pParent = NULL);	// 标准构造函数

// 对话框数据
	enum { IDD = IDD_HSVCS_DIALOG };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
	
// 实现
protected:
	HICON m_hIcon;

protected:	
	CHmjLabel	m_lblWorkMode; // 工作模式标签	
	CHmjListBox m_workModes; // 工作模式列表框
		
	CHmjLabel	m_lblMachine; // 机型选择标签	
	CHmjListBox m_machine; // 机型选择列表框
		
	CHmjLabel	m_lblPressure;  // 调压选择标签	
	CHmjListBox m_pressure; // 调压选择列表框

	CHmjLabel	m_lblSetItem;	// 设定项标签
	CEditListBox m_listSetItem;	// 设定项列表框

	CHmjLabel m_lblSysStatus;  // 系统状态标签

	CHmjLabel m_lblSysCmd;	// 系统命令标签		
	CHmjButton m_btnExit;  // 退出按钮（关闭设备）	
	CHmjButton m_btnStart; // 启动按钮	
	CHmjButton m_btnStop;  // 停止设备
	CRunStatusLabel m_lblRunStatus; // 运行状态标签
			
	CAbortPane				m_paneAbort;	// 半透明遮蔽式信息面板
	CPassWordPane			m_panePassWord;	// 

	int m_nCellCtrlCount;  // 界面信号元素控件数目
	CHmjCell*  m_pCellCtrls; // 界面信号元素控件数组

	CHmjCell	m_cellCurWorkTime; // 当前工作时间单元格
	CHmjCell	m_cellTotalWorkTime; // 全部工作时间单元格

	int m_nBlankCellCount;  // 空白单元格控件数目
	CHmjCell*  m_pBlankCells; // 空白单元格控件数组

protected:
	WINDOW_PARAM	m_windowParam;  // 窗口参数

protected:	
	CAiConverterFactory		m_aiConverterFactory;	// AI转换器工厂
	CSignalObjectFactory	m_signalObjectFactory;	// 信号工厂
	CParameterFactory		m_parameterFactory;		// 参数工厂
	CWorkModeFactory		m_workModeFactory;		// 工作模式工厂
	CLogicFactory			m_logicFactory;			// 逻辑工厂
	TOTAL_WORK_TIME			m_totalWorkTime; // 总工作时间
	CArray<CLogicCard*>		m_logicCards; // 逻辑板卡
	CHmjUiObjectManager		m_uiObjectManager; // UI管理器
	CLogicTimerManager		m_logicTimerManager; // 计时器管理器
	CLogicCounterManager	m_logicCounterManager; // 计数器管理器
	CStatusTimeManager		m_statusTimeManager; // 状态时间管理器
	CActionSignalManager	m_actionSignalManager; // 动作信号管理器
	CUiSignalFactory		m_uiSignalFactory; // UI信号工厂
	
protected:
	CDataManager  m_dataManager; // 数据管理器
	CThreadManager	m_threadManager; // 线程管理器

	BOOL  m_bRunning; // 设备是否正在运行
	BOOL  m_bWorkerThreadRuning; // 是否有工作线程正在运行
	BOOL  m_bAbort; // 是否ABORT
	BOOL  m_bLock; // ctrl+alt+shift+鼠标左键

private:
	CTime m_workStartTimer;	//设备启动时刻

protected:
	CMap<DWORD, DWORD, CDialogEx*, CDialogEx*>  m_dialogMsg;  // 全局DIALOG函数消息映射。KEY：消息地址，VALUE：消息框指针

protected:
	Bitmap*     m_pBmpLogo;       // LOGO图片
	BOOL		m_bLogo; // 是否加载LOGO图片

protected:
	// 创建字体
	// szFontName:输入参数，字体名称
	// nFontSize：输入参数，字体大小
	// font：输出参数，接收字体
	void CreateFontBy(const CString& szFontName, int nFontSize, CFont& font);

	// 设置界面布局
	void SetUiLayout();
	// 设置右侧面板布局
	// rcRightPane：输入参数，右侧面板的位置
	void SetRightPaneLayout(const CRect& rcRightPane);
	// 设置系统命令布局
	// rcSysCmd：输入参数，系统命令的位置
	void SetSysCmdLayout(const CRect& rcSysCmd);
	// 系统状态布局
	// rcSysStatus：输入参数，系统命令的位置
	void SetSysStatusLayout(const CRect& rcSysStatus);
	// 计算网格位置
	// rcSysStatus：输入参数，系统命令的位置
	// nIndex：输入参数，网格索引
	CRect GetCellCtrlPos(const CRect& rcSysStatus, int nIndex);
	// 返回网格的行数
	int GetGridRowCount();

protected:
	// 初始化时钟处理函数
	BOOL CheckAndInit();
	// 更新UI显示
	void RefreshUI();
	// 退出时钟的处理函数
	void OnQuitTimer();

	// 初始化
	BOOL Init();

	// 加载信号
	BOOL LoadSignals();
	// 加载参数
	BOOL LoadParameters();
	// 加载界面控件
	BOOL LoadUiCtrls();
	// 加载工作模式
	BOOL LoadWorkMode();
	// 初始化工作时间信息
	BOOL InitWorkTime();
	// 加载窗口参数
	BOOL GetWindowParams();

	// 清理板卡
	void ClearCards();
	// 启动设备
	// machine：输入参数，进行参数
	void StartDevice(const MODE_MACHINE& machine);
	// 启动待机逻辑
	BOOL StartWaitLogic();
	// 设置逻辑加载器参数
	// logicConfigLoader:逻辑加载器
	void SetLogicConfigLoaderParam(CLogicConfigLoader& logicConfigLoader);

protected:
	// 设置启动按钮的使能状态
	void SetStartButtonStatus();
	// 加载LOGO图片
	BOOL LoadLogo();
	// 设置线程管理器参数
	void SetThreadManagerParams();
	// 设置UI控件参数
	void SetUiCtrlParams();
	void SetListBox(CHmjLabel& label, const LABEL_PARAM& labelParam, CHmjListBox& listBox, const LISTBOX_PARAM& listParam);
	void SetLabelParam(CHmjLabel& label, const LABEL_PARAM& labelParam);
	void SetRunStatusLabelParam(CRunStatusLabel& label, const RUN_STATUS_PARAM& labelParam);
	void SetButtonParam(CHmjButton& button, const BUTTON_PARAM& buttonParam);

	// 绘制标题栏
	void DrawTitleBar(CDC* pDC);
	// 画工作模式列表框的边框
	void DrawListCtrlBorder(CDC* pDC, CHmjListBox* pListBox, COLORREF borderColor);

protected:
	// 根据运行状态设置控件的使能状态
	void EnableCtrlsByRuning();
	void SetCtrlStatusByAbort();

protected:
	DECLARE_MESSAGE_MAP()

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	virtual BOOL DestroyWindow();
	virtual BOOL PreTranslateMessage(MSG* pMsg);

	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();			
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnMove(int x, int y);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	afx_msg LRESULT OnNcHitTest(CPoint point);

	afx_msg void OnLbnSelchangeListWorkMode(); // 工作模式改变
	afx_msg void OnLbnSelchangeListMachine();  // 机型改变
	afx_msg void OnLbnSelchangeListPressure(); // 调压选择改变
	
	afx_msg void OnClickedButtonStart(); // 启动设备按钮
	afx_msg void OnClickedButtonStop(); // 停止设备按钮
	afx_msg void OnClickedButtonExit();	 // 关闭设备按钮
	afx_msg void OnClickedButtonOil(); // 油压检测按钮

	afx_msg LRESULT OnIoThreadMsg(WPARAM wParam, LPARAM lParam); // 处理I/O线程发送的消息	
	afx_msg LRESULT OnRunLogicThreadMsg(WPARAM wParam, LPARAM lParam); // 处理运行逻辑线程发送的消息
	afx_msg LRESULT OnStopLogicThreadMsg(WPARAM wParam, LPARAM lParam); // 处理停止逻辑线程发送的消息	
	afx_msg LRESULT OnWorkerThreadStopped(WPARAM wParam, LPARAM lParam); // 工作线程停止的消息	
	afx_msg LRESULT OnUiAlert(WPARAM wParam, LPARAM lParam); // UI控件报警消息处理
	afx_msg LRESULT OnLogicThreadAbortMsg(WPARAM wParam, LPARAM lParam); // WM_LOGIC_THREAD_ABORT_MSG消息处理函数
	afx_msg LRESULT OnLogicThreadDialogMsg(WPARAM wParam, LPARAM lParam); // WM_LOGIC_THREAD_DIALOG_MSG消息处理函数	
	afx_msg LRESULT OnLogicThreadRunning(WPARAM wParam, LPARAM lParam); // 处理逻辑线程正在运行的消息
	afx_msg LRESULT OnDoStopLogic(WPARAM wParam, LPARAM lParam);  // 开始停止逻辑
	afx_msg LRESULT OnStartWaitThread(WPARAM wParam, LPARAM lParam); // 启动待机线程
public:
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	CHmjButton m_btnOil;
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};
